package br.com.jk.valealim.cartao;

import br.com.jk.util.DAOException;
import br.com.jk.util.Util;
import br.com.jk.valealim.cartaovenda.CartaoVenda;
import br.com.jk.valealim.cartaovenda.CartaoVendaDao;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.hibernate.exception.ConstraintViolationException;

/**
 *
 * @author camilo
 */
public class CartaoDaoHibernate implements CartaoDao {

  public static final String PROPERTY_ID = "id";
  public static final String PROPERTY_TIPOCARTAO = "cartaoTipo";
  public static final String PROPERTY_CLIENTE = "nomeCliente";
  public static final String PROPERTY_CARTAONUM = "cartaoNumero";
  public static final String PROPERTY_CODVERIF = "cartaoCodVerif";
  private Session session;
  private Transaction transacao;

  public void setSession(Session session) {
    this.session = session;
  }

  @Override
  public void salvar(Cartao cartao) {
    this.transacao = this.session.beginTransaction();
    this.session.saveOrUpdate(cartao);
    this.transacao.commit();
    this.session.close();
  }

  @Override
  public void excluir(Cartao cartao) throws DAOException {
    try {
      this.transacao = this.session.beginTransaction();
      this.session.delete(cartao);
      this.transacao.commit();
      this.session.close();
    } catch (ConstraintViolationException e) {
      switch (e.getConstraintName()) {
        case CartaoVendaDao.NAME_FK_CARTAO:
          throw new DAOException("Não é possível excluir pois existe um registro "
                  + "correspondente na tabela "
                  + CartaoVendaDao.NAME_TABLE);
        default:
          throw new DAOException("Houve erro na exclusão. Possivelmente há um registro "
                  + "correspondente em outra tabela");
      }
    }
  }

  @Override
  public Cartao carregar(Integer cartao) {
    return (Cartao) this.session.get(Cartao.class, cartao);
  }

  @Override
  public List<Cartao> listar() {
    return this.session.createCriteria(Cartao.class).addOrder(Order.asc(PROPERTY_CLIENTE)).list();
  }

  @Override
  public List<Cartao> pesquisaPadrao(String campo, String parametro) {
    Criteria criteria = this.session.createCriteria(Cartao.class);
    criteria.add(Restrictions.ilike(campo, parametro, MatchMode.ANYWHERE));
    criteria.addOrder(Order.asc(campo));
    return (List<Cartao>) criteria.list();
  }

  @Override
  public List<Cartao> pesquisaPadrao(String campo, int parametro) {
    Criteria criteria = this.session.createCriteria(Cartao.class);
    criteria.add(Restrictions.eq(campo, parametro));
    criteria.addOrder(Order.asc(campo));
    return (List<Cartao>) criteria.list();
  }
}